#include <bits/stdc++.h>

using namespace std;

class Solution
{
public:
    // int fourSumCount(vector<int> &nums1, vector<int> &nums2, vector<int> &nums3, vector<int> &nums4)
    // {
    //     int length1 = nums1.size();
    //     int length2 = nums2.size();
    //     int length3 = nums3.size();
    //     int length4 = nums4.size();
    //     int count = 0;
    //     for (int i = 0; i < length1; i++)
    //     {
    //         for (int j = 0; j < length2; j++)
    //         {
    //             for (int k = 0; k < length3; k++)
    //             {
    //                 for (int l = 0; l < length4; l++)
    //                 {
    //                     if (nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0)
    //                     {
    //                         count++;
    //                     }
    //                 }
    //             }
    //         }
    //     }
    //     return count;
    // }

    // int fourSumCount(vector<int> &nums1, vector<int> &nums2, vector<int> &nums3, vector<int> &nums4)
    // {
    //     int length1 = nums1.size();
    //     int length2 = nums2.size();
    //     int length3 = nums3.size();
    //     int length4 = nums4.size();

    //     multiset<int> set;
    //     for (int i = 0; i < length1; i++)
    //     {
    //         for (int j = 0; j < length2; j++)
    //         {
    //             set.insert(nums1[i] + nums2[j]);
    //         }
    //     }

    //     int count = 0;
    //     for (int i = 0; i < length3; i++)
    //     {
    //         for (int j = 0; j < length4; j++)
    //         {
    //             if (set.find(0 - nums3[i] - nums4[j]) != set.end())
    //             {
    //                 count += set.count(0 - nums3[i] - nums4[j]);
    //             }
    //         }
    //     }

    //     return count;
    // }

    // int fourSumCount(vector<int> &nums1, vector<int> &nums2, vector<int> &nums3, vector<int> &nums4)
    // {
    //     int n = nums1.size();

    //     multiset<int> set1;
    //     multiset<int> set2;

    //     for (int i = 0; i < n; i++)
    //     {
    //         for (int j = 0; j < n; j++)
    //         {
    //             set1.insert(nums1[i] + nums2[j]);
    //             set2.insert(nums3[i] + nums4[j]);
    //         }
    //     }

    //     int count = 0;

    //     for (auto it = set1.begin(); it != set1.end(); it++)
    //     {
    //         int num = 0 - *it;
    //         if (set2.find(num) != set2.end())
    //         {
    //             count += set2.count(num);
    //         }
    //     }

    //     return count;
    // }

    int fourSumCount(vector<int> &nums1, vector<int> &nums2, vector<int> &nums3, vector<int> &nums4)
    {
        unordered_map<int, int> map;
        for (auto i : nums1)
        {
            for (auto j : nums2)
            {
                map[i + j]++;
            }
        }

        int count = 0;
        for (auto i : nums3)
        {
            for (auto j : nums4)
            {
                count += map[0 - i - j];
            }
        }
        return count;
    }
};

int main()
{
    vector<int> vec1{1, 2};
    vector<int> vec2{-2, -1};
    vector<int> vec3{-1, 2};
    vector<int> vec4{0, 2};

    Solution sol;
    cout << sol.fourSumCount(vec1, vec2, vec3, vec4) << endl;
    return 0;
}